//
// Created by Crazy.Mo on 2018/8/31.
//
#include <jni.h>
#include <string>
#include <android/log.h>

#define  LOG(...) __android_log_print(ANDROID_LOG_ERROR,"CrazyMoJNI",__VA_ARGS__);

JavaVM* _vm=NULL;
//1、C++代码 若无参数需要传递，JNIEnv *env, jobject jobj可省，若传递参数必须
void  dynamic(JNIEnv *env, jobject jobj){
    LOG("dynamicRegist 已动态注册到dynamic（无参数）");
}
void  dynamic2(JNIEnv *env, jobject jobj,jint i){
    LOG("dynamicRegist 已动态注册dynamic2（%d）",i);
}

//2、需要动态注册的方法数组,这JNINativeMethod包含三部分：{Java层的方法名，方法签名，(返回值*)本地方法名,}）
static const JNINativeMethod mMethods[] = {
        {"dynamicRegist","()V", (void *)dynamic},
        {"dynamicRegist", "(I)V", (void *)dynamic2}
};

//3、需要动态注册native方法的Java类名（.改为/）
static const char* mClassName = "com/crazymo/ndk/jni/DynamicRegistJNI";

//4、重写JNI_OnLoad
int JNI_OnLoad(JavaVM* vm, void* reserved){
    LOG("【JNI_OnLoad 被执行并完成JavaVM的初始化】");
    _vm=vm;
    JNIEnv* env = 0;
    //从vm 中获得 JniEnv
    int r = vm->GetEnv((void**) &env, JNI_VERSION_1_6);
    if( r != JNI_OK)
    {
        return -1;
    }
    jclass javaClz = env->FindClass(mClassName);//反射获取Java层的Class，这个类不能被混淆，所有有Native方法的类都不能混淆
    // 注册 如果小于0则注册失败
    r = env->RegisterNatives(javaClz,mMethods,sizeof(mMethods)/sizeof(JNINativeMethod));//要注册Java类对应的class 数组  要注册的方法数即数组长度
    if(r!= JNI_OK )
    {
        return -1;
    }
    return JNI_VERSION_1_6;
}


